home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / source / vgascrol / scroll4.pas < prev    next >
Pascal/Delphi Source File  |  1995-03-15  |  5KB  |  200 lines

  1. { Chain-4 mode example - scrolling 640x400 screen    }
  2. { By Paradise / Fate (paradise@bachus.umcs.lublin.pl }
  3.  
  4. uses Palette;
  5.  
  6. procedure InitVga4; assembler;
  7. asm
  8.     mov    ax, 0013h    { Use bios to enter standard Mode 13h }
  9.     int    10h
  10.     mov    dx, 03c4h    { Set up DX to one of the VGA registers }
  11.     mov    al, 04h      { Register = Sequencer : Memory Modes }
  12.     out    dx, al
  13.     inc    dx           { Now get the status of the register }
  14.     in     al, dx       { from the next port }
  15.     and    al, 0c7h     { AND it with 11000111b ie, bits 3,4,5 wiped }
  16.     or     al, 04h      { Turn on bit 2 (00000100b) }
  17.     out    dx, al       { and send it out to the register }
  18.     mov    dx, 03c4h    { Again, get ready to activate a register }
  19.     mov    al, 02h      { Register = Map Mask }
  20.     out    dx, al
  21.     inc    dx
  22.     mov    al, 0fh      { Send 00001111b to Map Mask register }
  23.     out    dx, al       { Setting all planes active }
  24.     mov    ax, 0a000h   { VGA memory segment is 0a000h }
  25.     mov    es, ax       { load it into ES }
  26.     sub    di, di       { clear DI }
  27.     mov    ax, di       { clear AX }
  28.     mov    cx, 8000h    { set entire 64k memory area (all 4 pages) }
  29.     repnz  stosw        { to colour BLACK (ie, Clear screens) }
  30.     mov    dx, 03d4h    { User another VGA register }
  31.     mov    al, 14h      { Register = Underline Location }
  32.     out    dx, al
  33.     inc    dx           { Read status of register }
  34.     in     al, dx       { into AL }
  35.     and    al, 0bFh     { AND AL with 10111111b }
  36.     out    dx, al       { and send it to the register }
  37.                         { to deactivate Double Word mode addressing }
  38.     dec    dx           { Okay, this time we want another register,}
  39.     mov    al, 17h      { Register = CRTC : Mode Control }
  40.     out    dx, al
  41.     inc    dx
  42.     in     al, dx       { Get status of this register }
  43.     or     al, 40h      { and Turn the 6th bit ON }
  44.     out    dx, al       { to turn WORD mode off }
  45.                         { And thats all there is too it!}
  46.     mov    dx, 3d4h
  47.     mov    al, 13h
  48.     out    dx, al
  49.     inc    dx
  50.     mov    al, 80       { 80 * 8 = Pixels across. Only 320 are visible}
  51.     out    dx, al
  52. end;
  53.  
  54. procedure CloseVga; assembler;
  55. asm
  56.     mov    ax, 13h
  57.     int    10h
  58. end;
  59.  
  60. procedure PutPixel(X,Y: Integer; Color: Byte); assembler;
  61. asm
  62.     mov    bx, x
  63.     mov    ax, Y
  64.     mov    cx, 160
  65.     mul    cx
  66.     mov    di, ax
  67.     mov    ax, bx
  68.     shr    ax, 1
  69.     shr    ax, 1
  70.     add    di, ax
  71.     and    bx, 3
  72.     mov    ah, 1
  73.     mov    cl, bl
  74.     shl    ah, cl
  75.     mov    al, 2
  76.     mov    dx, 03C4h
  77.     mov    bx, $A000
  78.     mov    es, bx
  79.     out    dx, ax
  80.     mov    al, Color
  81.     mov    es:[di], al
  82. end;
  83.  
  84. procedure SetAddress(Offs: Word); assembler;
  85. asm
  86.     mov    dx, 03d4h
  87.     mov    al, 0ch
  88.     mov    ah, [byte(Offs)+1]
  89.     out    dx, ax
  90.     mov    al, 0dh
  91.     mov    ah, [byte(Offs)]
  92.     out    dx, ax
  93. end;
  94.  
  95. function KeyPressed: Boolean; assembler;
  96. asm
  97.     in     al, 60h
  98.     cmp    al, 1
  99.     je     @exit
  100.     xor    al, al
  101. @exit:
  102. end;
  103.  
  104. procedure Retrace; assembler;
  105. asm
  106.     mov    dx, 3dah
  107. @@1:
  108.     in     al, dx
  109.     test   al, 8
  110.     jnz    @@1
  111. @@2:
  112.     in     al, dx
  113.     test   al, 8
  114.     jz     @@2
  115. end;
  116.  
  117. procedure LoadPic(fname: String);
  118. var
  119.  scanline : array [0..639] of byte;
  120.  pfile    : file;
  121.  y,x      : integer;
  122. begin
  123.  fillchar(stdpal,768,0);
  124.  SetPalette(stdpal);
  125.  assign(pfile,fname);
  126.  reset(pfile,1);
  127.  blockread(pfile,stdpal,768);
  128.  for y:=0 to 399 do
  129.  begin
  130.   blockread(pfile,scanline,640);
  131.   for x:=0 to 639 do putpixel(x,y,scanline[x]);
  132.  end;
  133.  close(pfile);
  134. end;
  135.  
  136. var Offset: Word;
  137.     MasterTab: Array [0..360,1..2] of Integer;
  138.     i,Counter: Integer;
  139.     Ende,FadeIn,FadeOut: Boolean;
  140.     zero,picp: paltype;
  141.     licznik: longint;
  142.  
  143. procedure InitTab;
  144. begin
  145.  for i:=0 to 360 do
  146.  begin
  147.   MasterTab[i,1]:=-120+ Round(40* -Sin((i+(i))*PI/90));
  148.   MasterTab[i,2]:= 100+ Round(90*  Cos((i+(2*i))*PI/180));
  149.  end;
  150.  Counter:=0;
  151. end;
  152.  
  153. procedure NewTab;
  154. begin
  155.  Offset:=MasterTab[Counter,2]*160+MasterTab[Counter,1];
  156.  Inc(Counter);
  157.  if Counter>360 then Counter:=0;
  158. end;
  159.  
  160. procedure InitMisc;
  161. begin
  162.  fillchar(zero,768,0);
  163.  picp:=stdpal;
  164.  stdpal:=zero;
  165.  Ende:=false;
  166.  FadeOut:=False;
  167.  FadeIn:=True;
  168.  licznik:=0;
  169.  SetPalette(stdpal);
  170. end;
  171.  
  172. procedure PullMisc;
  173. begin
  174.  Retrace;
  175.  inc(licznik);
  176.  if (FadeIn) and (licznik mod 4=0) then
  177.  begin
  178.   if not(StepPalette(stdpal,picp)) then FadeIn:=False;
  179.   SetPalette(stdpal);
  180.  end;
  181.  if keypressed then begin FadeIn:=False; Ende:=True; FadeOut:=True; end;
  182.  if (FadeOut) and (licznik mod 2=0) then
  183.  begin
  184.   if not(StepPalette(stdpal,zero)) then FadeOut:=False;
  185.   SetPalette(stdpal);
  186.  end;
  187. end;
  188.  
  189. begin
  190.  InitVga4;
  191.  LoadPic('alien.pic');
  192.  InitTab;
  193.  InitMisc;
  194.  Repeat
  195.   NewTab;
  196.   SetAddress(Offset);
  197.   PullMisc;
  198.  Until (Ende and not(FadeOut));
  199.  CloseVga;
  200. end.